package com.ymkyve.complex.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servelt工作原理实例，将所有访问过该客户端的IP地址记录到服务器的某个文件中。
 * 测试地址：http://localhost:8080/aa.complex
 * @author AllanLxf
 * @version 1.0
 */

public class ComplexServlet extends HttpServlet{

    private static final long serialVersionUID = -3234123364493189026L;
    

    private PrintWriter logger; 

    /**
     * Servlet的初始化方法。 不同的平台下文件的路径写法不一样，为了做到Servlet的平台无
     * 关性，将用来保存客户端IP地址的文件路径以初始化参数的形式提供，这样只需在部署Servlet
     * 的时候指定或改变该文件的 路径即可，而不用重新编译Servlet源代码。
     * 由于频繁打开关闭文件效率很低，所以在init()方法中打开文件，在service()方法中写文
     * 件，在destroy()方法中关闭文件为最佳实践。
     * @throws ServletException
     *     如果Servlet没有配置初始化参数filename或参数filename所指定的文件无法找到时。
     */
     public void init() throws ServletException
     {
         String filename = getInitParameter("filename");
         try
         {
             FileOutputStream fout = new FileOutputStream(filename, true);
             logger = new PrintWriter(fout);
         } catch (IOException e)
         {
             throw new ServletException("fail to open:" + filename);
         }
     } 

    /**
     * Servlet服务方法，记录客户端的IP地址到日志文件中。
     * 由于文件属于共享资源，多个线程同时写一个文件，会出现结果混乱的情况，所以要控制同步
     * 访问。
     * @param request     包含客户端请求信息的对象。
     * @param response    包含服务器响应信息的对象。
     */
    public void service(HttpServletRequest request, HttpServletResponse response)
                                         throws ServletException, IOException
    {
         response.setContentType("text/html;charset=gbk");
         PrintWriter out = response.getWriter();
         out.println("<html>");
         out.println("<head>");
         out.println("  <title>ip-log</title>");
         out.println("</head>");
         out.println("<body>");
         out.println("<h3 align=\"center\">Thanks for your visiting!</h3>");
         out.println("</body>");
         out.println("</html>");
         //记录日志信息

         synchronized (this)
         {
             logger.print(new java.util.Date());
             logger.print(":来自客户端：");
             logger.println(request.getRemoteAddr());
         }
    }

    /**
     * Servlet实例销毁方法。关闭日志文件。
     */
    public void destroy()
    {
         logger.close();
    }


	
}
